package com.afdor.rws.annotation.extension;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 扩展点<br/>
 * 组件的具体实现
 *
 * @author 悭梵
 * @date Created in 2018-08-03 19:15
 */
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Extension {
    /**
     * 名称
     *
     * @return
     */
    String value();

    /**
     * 作用域
     * <ul>
     * <li>Scope.SINGLETON 单例模式，默认值</li>
     * <li>Scope.PROTOTYPE 原型模式，多实例</li>
     * </ul>
     *
     * @return
     */
    Scope scope() default Scope.SINGLETON;

    /**
     * 多扩展点执行排序
     *
     * @return
     */
    int order() default NORMAL_ORDER;

    /**
     * 实现接口
     *
     * @return
     */
    Class<?> interfaceClass() default Object.class;

    /**
     * 多扩展点执行排序 - 最高优先级
     */
    int MAX_ORDER = Integer.MAX_VALUE;
    /**
     * 多扩展点执行排序 - 最底优先级
     */
    int MIN_ORDER = Integer.MIN_VALUE;
    /**
     * 多扩展点执行排序 - 一般先级
     */
    int NORMAL_ORDER = 1;

    enum Scope {
        /**
         * 单例模式
         */
        SINGLETON,
        /**
         * 原型模式
         */
        PROTOTYPE
    }

}
